package com.atguigu02.project.model;

/**
 * ClassName: CustomerList
 * Package: com.atguigu02.project.model
 * Description:
 * CustomerList为Customer对象的管理模块，内部使用数组管理一组Customer对象
 * @Author ZY
 * @Create 22:33
 * @Version 1.0
 */
public class CustomerList {

    private Customer[] customers;//用来保存客户对象的数组
    private int total = 0;//用来记录已保存客户对象的数量

    /**
     * 用途:构造器，用来初始化customers数组，在创建(new)客户对象列表时,同时传递一个参数用来确定该客户对象列表数组的大小
     * @param totalCustomer 指定customers数组的最大空间.
     */
    public CustomerList(int totalCustomer){
        customers = new Customer[totalCustomer];
    }

    /**
     * 用途:新客户会被添加到数组中当前已有客户的最后一个位置之后，并更新客户总数。
     * @param customer 指定要添加的客户对象
     * @return 添加成功返回true，false表示数组已满，无法添加
     */
    public boolean addCustomer(Customer customer){
        // 检查当前客户总数是否小于数组容量
        if(total < customers.length){
            //将新客户添加到数组中当前已有客户的最后一个位置之后，并将客户总数（total）加1
            customers[total++] = customer;
            return true;
        }
        return false;

    }

    /**
     * 用途:用参数cust替换数组中由index指定的对象
     * @param index 指定旧客户对象的索引
     * @param cust  指定替换的新客户对象
     * @return 替换成功返回true；false表示索引无效，无法替换
     */
    public boolean replaceCustomer(int index, Customer cust){
        // 检查索引是否有效，同时将新客户对象替换到数组中指定位置
        if(index >= 0 && index < total){
            customers[index] = cust;
        }
        return false;
    }

    /**
     * 用途:从数组中删除参数index指定索引位置的客户对象记录
     * @param index 指定被删除的客户对象在数组中的索引位置，从0开始
     * @return 删除成功返回true，false表示索引无效，无法删除
     */
    public boolean deleteCustomer(int index){
        //无效范围
        if(index < 0 || index >= total){
            return false;
        }
        //有效范围,从index位置开始，将后面的元素都向前移动一个位置
        for (int i = index; i < total - 1 ; i++) {
            customers[i] = customers[i + 1];
        }

        //将有效数据最后一个位置置空
//        customers[total - 1] = null;
//        total--;
        //或
        customers[--total] = null;
        return true;
    }

    /**
     * 用途:返回数组中记录的所有客户对象
     * @return Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同
     */
    public Customer[] getAllCustomers(){
        //创建一个新数组，其长度等于customers数组中已保存的客户对象的数量
        Customer[] custs = new Customer[total];
        //将customers数组中的客户对象复制到新数组中，并返回新数组
        for (int i = 0; i < custs.length; i++) {
            custs[i] = customers[i];
        }
        return custs;
    }

    /**
     * 用途:返回参数index指定索引位置的客户对象记录
     * @param index 指定索要获取的客户在数组中的索引位置，从0开始
     * @return 封装了客户信息的customer对象
     */
    public Customer getCustomer(int index){
        if(index < 0 || index >= total){
            return null;
        }
        return customers[index];
    }

    /**
     * 用途:获取客户列表中客户的数量
     * @return total
     */
    public int getTotal(){
        return total;
    }

}
